package cn.slg.module.system.service.pk.utils;

import cn.slg.module.system.controller.pk.vo.PKVO;
import cn.slg.module.system.dal.dataobject.group.Group;
import cn.slg.module.system.dal.dataobject.state.PersistenceState;
import cn.slg.module.system.dal.dataobject.state.PropertyState;
import cn.slg.module.system.dal.dataobject.state.State;
import cn.slg.module.system.dal.dataobject.wujiang.WuJiangDO;
import cn.slg.module.system.service.pk.bo.PKBO;

import java.util.List;

import static cn.slg.module.system.service.pk.utils.Show.*;

// 武将战死的处理机制
public class Die {

    // 判断战斗是否要继续
    public static boolean whetherContinue(PKBO PKBO) {
        Group firstGroup = PKBO.getFirstGroup();
        Group secondGroup = PKBO.getSecondGroup();
        if (firstGroup.getMain().getIsDie() || secondGroup.getMain().getIsDie()) {
            return false;
        } else {
            return true;
        }
    }

    // 判断战斗是否继续
    public static boolean whetherContinue(WuJiangDO wuJiangDO) {
        Group teammates = wuJiangDO.getTeammates();
        Group enemy = wuJiangDO.getEnemy();
        if (teammates.getMain().getIsDie() || enemy.getMain().getIsDie()) {
            return false;
        } else {
            return true;
        }
    }

    // 移除自己被施加的状态(自己战死的时候执行)
    public static <T> void clearSelfState(List<T> states) {
        int size = states.size();
        for (int i = 0; i < size; i++) {
            State state = (State) states.getFirst();
            state.end();
            //[自己]战死，其身上被[施加者]施加的【stateName】消失
            System.out.println(spacing2() + showName(state.getReceiver()) + "战死，其身上被" + showName(state.getInflictor())
                    + "施加的" + parcel1(state.getStateName()) + "状态消失");
        }
    }

    // 移除因为自己而施加给别人的状态(自己战死的时候执行)
    // 规则：如果是因为自己指挥战法所产生的状态，就取消；其他战法产生的状态，仍旧保留。
    public static <T> void clearOtherState(List<T> otherStates, WuJiangDO self) {
        for (int i = 0; i < otherStates.size(); i++) {
            State state = (State) otherStates.get(i);
            if (state.getInflictor().getId().equals(self.getId()) && state.getSkillName().startsWith("指挥_")) {
                // 如果该属性状态是自己的指挥战法施加的，该属性状态终止
                state.end();

                // 显示移除提示信息
                // 【张飞】来自【施加者】的【受到伤害降低】效果被移除
                WuJiangDO inflictor = state.getInflictor();
                WuJiangDO receiver = state.getReceiver();
                System.out.println(spacing2() + "由于" + showName(inflictor) + "战死，" + showName(receiver) + "来自" + showName(inflictor) +
                        "的" + parcel1(state.getStateName()) + "状态消失");
                // 索引前移一位
                i--;
            }
        }
    }


    /**
     * 目标如果死亡,处理流程
     *
     * @param attacker 攻击者
     * @param target   目标(要死的武将)
     * @return 是否结束战斗, 武将有连续战斗效果时用
     */
    public static boolean dieProcess(WuJiangDO attacker, WuJiangDO target) {
        // 武将如果死了，
        // 他受到别人施加的状态怎么办
        clearSelfState(target.getPropertyStates());
        clearSelfState(target.getPersistenceStates());

        // 他施加给别人的状态怎么办(规则：如果是因为指挥战法所产生的状态，就取消；其他战法产生的状态，仍旧保留)
        // 先拿到所有的队友
        List<WuJiangDO> teammatesAllGroup = target.getTeammates().getAllGroup();
        teammatesAllGroup.forEach(wuJiangDO -> {
            // 遍历每一个队友的每一个属性状态
            List<PropertyState> propertyStates = wuJiangDO.getPropertyStates();
            clearOtherState(propertyStates, target);

            // 遍历每一个队友的每一个持续性状态
            List<PersistenceState> persistenceStates = wuJiangDO.getPersistenceStates();
            clearOtherState(persistenceStates, target);
        });

        // 再拿到所有的敌人
        List<WuJiangDO> enemyAllGroup = target.getEnemy().getAllGroup();
        enemyAllGroup.forEach(wuJiangDO -> {
            // 遍历每一个敌人的每一个属性状态
            List<PropertyState> propertyStates = wuJiangDO.getPropertyStates();
            clearOtherState(propertyStates, target);
            // 遍历每一个敌人的每一个持续性状态
            List<PersistenceState> persistenceStates = wuJiangDO.getPersistenceStates();
            clearOtherState(persistenceStates, target);
        });

        // 战斗是否要继续
        boolean isEnd = false;
        // 3.判定这个target属于哪个Group,再将其从相应的Group里remove
        if (attacker.getTeammates().getAllGroup().contains(target)) {
            // 3.1如果target是队友
            // 3.1.1将队友移入战死组
            attacker.getTeammates().getDies().add(target);
            // 3.1.2将这个队友移出战斗组
            attacker.getTeammates().getFightGroup().remove(target);

            // 3.1.3判断自己主将是否战死了,如果战死,结束战斗
            if (attacker.getTeammates().getMain().getIsDie()) {
                isEnd = true;
                Group group = attacker.getTeammates();
                String s = group.getAttackerOrDefense() + "主将" + "[" + group.getMain().getName() + "]" + "兵力为0,无法再战," +
                        (group.getAttackerOrDefense().equals("攻击方") ? "防守方" : "攻击方") + "胜利";
                System.out.println(s);
            }

        } else if (attacker.getEnemy().getAllGroup().contains(target)) {
            // 3.2如果是敌人
            // 3.2.1首先将这个敌人移入战死组
            attacker.getEnemy().getDies().add(target);
            // 3.2.2将这个敌人移出战斗组
            attacker.getEnemy().getFightGroup().remove(target);

            // 3.2.3判断敌人主将是否战死了,如果战死,结束战斗
            if (attacker.getEnemy().getMain().getIsDie()) {
                isEnd = true;
                Group group = attacker.getEnemy();
                String s = group.getAttackerOrDefense() + "主将" + "[" + group.getMain().getName() + "]" + "兵力为0,无法再战," +
                        (group.getAttackerOrDefense().equals("攻击方") ? "防守方" : "攻击方") + "胜利";
                System.out.println(s);
            }
        }
        return isEnd;
    }


}
